// 包含主要头文件，通常定义在项目的根目录或特定于硬件的目录下
#include "main.h"

// 定义源数组，用于存储初始数据
uint8_t srcArray[4] = {0, 1, 2, 3};
// 定义目标数组，用于接收DMA传输的数据
uint8_t dstArray[4];

// DMA配置函数
void DMA_Config(void) {
    // 使能DMA2和GPIOA的时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);

    // 初始化DMA结构体变量
    DMA_InitTypeDef DMA_InitStructure;
    // 将DMA2 Stream1复位到初始状态
    DMA_DeInit(DMA2_Stream1);

    // 配置DMA通道为Channel_4，这个通道通常不与特定的外设冲突
    DMA_InitStructure.DMA_Channel = DMA_Channel_4;
    // 设置DMA外设地址，这里为源数组的地址
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)srcArray;
    // 设置DMA内存地址，这里为目标数组的地址
    DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)dstArray;
    // 设置DMA传输方向为内存到内存
    DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToMemory;
    // 设置DMA传输的数据量
    DMA_InitStructure.DMA_BufferSize = 4;
    // 设置DMA外设地址自增
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
    // 设置DMA内存地址自增
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    // 设置DMA外设数据宽度为字节
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    // 设置DMA内存数据宽度为字节
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    // 设置DMA模式为正常模式，即单次传输
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
    // 设置DMA优先级为高
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    // 禁用FIFO模式
    DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
    // 设置DMA内存突发传输为单个数据
    DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    // 设置DMA外设突发传输为单个数据
    DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    // 使用上述配置初始化DMA2 Stream1
    DMA_Init(DMA2_Stream1, &DMA_InitStructure);
    // 使能DMA2 Stream1
    DMA_Cmd(DMA2_Stream1, ENABLE);
}

//int main(void) {
//    // 初始化延时函数（通常基于SysTick）
//    delay_init(168);
//    // 配置USART1（通常用于串口通信）
//    Usart1_Config();
//    // 打印源数组内容
//    printf("sor:");
//    for (int i = 0; i < 4; i++) {
//        printf("%x\t", srcArray[i]);
//    }
//    printf("\r\n");
//    // 打印DMA传输前目标数组内容（未初始化，可能为随机值）
//    printf("dst before DMA:");
//    for (int i = 0; i < 4; i++) {
//        printf("%x\t", dstArray[i]);
//    }
//    printf("\r\n");

//    // 调用DMA配置函数
//    DMA_Config();

//    // 等待DMA传输完成（轮询DMA传输完成标志）
//    while (DMA_GetFlagStatus(DMA2_Stream1, DMA_FLAG_TCIF1) == RESET) {}
//    // 清除DMA传输完成标志
//    DMA_ClearFlag(DMA2_Stream1, DMA_FLAG_TCIF1);

//    // 打印DMA传输后源数组内容（应保持不变）
//    printf("sor after DMA:");
//    for (int i = 0; i < 4; i++) {
//        printf("%x\t", srcArray[i]);
//    }
//    printf("\r\n");
//    // 打印DMA传输后目标数组内容（应与源数组相同）
//    printf("dst after DMA:");
//    for (int i = 0; i < 4; i++) {
//        printf("%x\t", dstArray[i]);
//    }
//    printf("\r\n");

//    // 主循环，通常用于保持程序运行，等待外部事件或执行其他任务
//    while (1) {
//        // 可以在此处添加其他代码
//    }
//}
